package com.wn.servlet.demo04;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author yellow Docter
 * @date 2022 -06-28
 * @desc
 */
public class AppUser {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {

        Map<String,Object> map = new HashMap<>();

        map.put("username","刘强东");
        map.put("age",40);

        // 01 安装插件
        // 02 选中 user变量 alt + enter
        User user = new User();

        // 需要使用反射 把 map中的值赋值给 user (map中的key和user中的属性名称一致 )
        Class<User> clazz = (Class<User>) user.getClass();

        User u = mapToBean(map, clazz);
        System.out.println("u = " + u);

    }

    /**
     * 通过反射封装  map转成bean对象的操作
     * @param map
     * @param clazz
     * @return
     */
    private static User mapToBean(Map<String, Object> map, Class<User> clazz) throws IllegalAccessException, InstantiationException {

        // clazz 可以拿到所有的 对象的属性名称
        User user = clazz.newInstance();

        //反射 拿到所有的属性对象
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            String key = field.getName();
            System.out.println("name = " + key);

             //如何从map中获取value
            Object o = map.get(key);
            System.out.println(key + "," + o);

            //跳过安全 检查
            field.setAccessible(true);
            // 给属性进行 赋值操作
            /**
             * 给属性进行赋值
             * 参数1:这个属性是那个对象
             * 参数2:这个属性赋值的值
             */
            // field.getType()拿到属性的类型
            if (field.getType() == String.class){
                field.set(user,o);
            }
            // field.getType()拿到属性的类型
            if (field.getType() == Integer.class){
                // 把 obj转成 字符串
                // 通过 Integer.parseInt() 把 字符串转成integer
                field.set(user,Integer.parseInt(o.toString()));
            }
        }
        //反射中可以操作 属性 ,可以给属性进行赋值
        return user;

    }
}
